/*
 ******************
 * author: 马丰彦
 * date: 2019-05-05
 * function: 手机九宫格数字映射字母罗列组合算法
 ******************
 */

function combination(num) {
  // 创建键盘映射
  let map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']

  // 首先判断用户输入参数是否为一个并且为数字
  let reg = /^[0-9]*$/
  if (arguments.length !== 1 && reg.test(num)) {
    console.log('参数错误!')
    return false
  }
  // 把用户输入的 字符串&数字 变成数组
  let arr = (num + '').split('')
  // 把用户输入的数字转化为键盘映射
  let arrStr = []
  arr.forEach(item => {
    // 判断用户是否超出界限
    if (map[item]) {
      arrStr.push(map[item])
    }
  })
  // console.log(arrStr)

  // 开始循环组合,函数表达式
  let comb = arr => {
    // 创建一个临时数组
    // console.log(arr)
    let middle = []
    for (let i = 0; i < arr[0].length; i++) {
      for (let j = 0; j < arr[1].length; j++) {
        middle.push(`${arr[0][i]}${arr[1][j]}`)
      }
    }
    // 分割填充数组
    arrStr.splice(0, 2, middle);
    // 判断数组长度是否需要继续递归下去
    if (arrStr.length > 1) {
      comb(arr)
    }
    return arr[0]
  }
  return comb(arrStr)
}
console.log(combination(234))
/* [ 'adg',
'adh',
'adi',
'aeg',
'aeh',
'aei',
'afg',
'afh',
'afi',
'bdg',
'bdh',
'bdi',
'beg',
'beh',
'bei',
'bfg',
'bfh',
'bfi',
'cdg',
'cdh',
'cdi',
'ceg',
'ceh',
'cei',
'cfg',
'cfh',
'cfi'] */